签到
今日已有 = $sign_count; ?> 人签到
```
**Model注入Hook** (如 `hook/model_inc_file.php`):
```php
'我的插件',
'插件设置' => '插件设置',
```
## 2.3 Overwrite(覆盖)机制
### 2.3.1 工作原理
Overwrite机制允许插件**完全替换**系统文件或其他插件的文件。通过在插件目录下创建与原始文件路径相同的文件来实现。
```
原始文件: view/htm/header.inc.htm
覆盖文件: plugin/my_theme/overwrite/view/htm/header.inc.htm
```
### 2.3.2 覆盖路径映射
覆盖文件的路径 = `plugin/{插件名}/overwrite/` + 原始文件相对于APP\_PATH的路径
示例:
| 原始文件 | 覆盖文件 |
| ----------------------------------- | ------------------------------------------------------------- |
| `view/htm/header.inc.htm` | `plugin/my_theme/overwrite/view/htm/header.inc.htm` |
| `route/index.php` | `plugin/my_plugin/overwrite/route/index.php` |
| `plugin/xn_search/route/search.php` | `plugin/my_theme/overwrite/plugin/xn_search/route/search.php` |
> **重要**: 主题可以覆盖其他插件的文件,实现深度适配。
### 2.3.3 权重排序
多个插件覆盖同一文件时,`overwrites_rank`值最大的胜出:
```json
{
"overwrites_rank": {
"view/htm/header.inc.htm": 100
}
}
```
### 2.3.4 Overwrite后的Hook处理
被overwrite的文件仍然会继续走hook编译流程,即overwrite文件中的`// hook xxx`和``标记仍然有效。
## 2.4 \_include() 函数详解
`_include()` 是插件系统的核心函数,定义在 `model/plugin.func.php`:
```php
function _include($srcfile) {
global $conf;
$len = strlen(APP_PATH);
$tmpfile = $conf['tmp_path'].substr(str_replace('/', '_', $srcfile), $len);
if(!is_file($tmpfile) || DEBUG > 1) {
// 第一次编译: 处理overwrite + hook
$s = plugin_compile_srcfile($srcfile);
// 处理